package com.teach.util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import com.alibaba.fastjson.JSON;
import com.teach.dto.PageDTO;


/**
 * <pre>
 * - 给EL表达式使用的工具类
 * - 使用上下文监听器给上下文属性加入该对象 application.setAttribute("t",new ELTools());
 * - jsp中EL示例：${t.formatDate(date)}
 * ClassName : com.teach.commons.Tools
 * Author : Administrator
 * E-Mail : 2233875735@qq.com
 * Date : 2020年7月4日 上午9:47:41
 * Version : 1.0
 * Copyright 2020 jlzhou.top Inc. All rights reserved. 
 * Warning: this content is only for internal circulation of the company. It is forbidden to divulge it or use it for other commercial purposes
 * </pre>
 *
 */
public class ELTools {
	
	private static ThreadLocal<SimpleDateFormat> format = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy-MM-dd"));

	/**
	 * 格式化日期，格式：yyyy-MM-dd
	 * @param date 
	 * @return
	 */
	public String formatDate(Date date){
		return format.get().format(date);
	}
	
	public String formatDate(Date date,String format){
		return new SimpleDateFormat(format).format(date);
	}
	
	/**
	 * 四舍五入保留小数点
	 * @param number 
	 * @param len - 保留小数点 位数
	 * @return
	 */
	public String formatNumber(BigDecimal number,int len){
		number = number.setScale(len, RoundingMode.HALF_UP);
		return number.toString();
	}
	
	/**
	 * 四舍五入保留小数点
	 * @param number 
	 * @param len - 保留小数点 位数
	 * @return
	 */
	public String formatNumber(Float number,int len){
		return formatNumber(new BigDecimal(number),len);
	}
	
	/**
	 * 四舍五入保留小数点
	 * @param number 
	 * @param len - 保留小数点 位数
	 * @return
	 */
	public String formatNumber(Double number,int len){
		return formatNumber(new BigDecimal(number),len);
	}
	
	public String formatNumber(String number,int len){
		return formatNumber(new BigDecimal(number),len);
	}
	
	/**
	 * 四舍五入保留小数点
	 * @param number 
	 * @param len - 保留小数点 位数
	 * @return
	 */
	public String formatNumber(double number,int len){
		return formatNumber(new BigDecimal(number),len);
	}
	

	
	private String li = "<li class=\"page-item{active}\"><a class=\"page-link\" data-page=\"{pageNumber}\" href=\"{pageURL}\">{pageText}</a></li>";
	private String formatLi(boolean active,int pageNumber,String pageURL,String pageText){
		return li.replace("{active}", active?" active":"").replace("{pageNumber}", pageNumber+"").replace("{pageURL}", pageURL).replace("{pageText}", pageText);
	}
	
	/**
	 * 格式化分页页码
	 * @param page
	 * @param max
	 * @param url 页码连接使用占位符{page}对应页码
	 * @return
	 */
	public String page(PageDTO<?> page,int max,String url){
		if(page==null || page.getTotal()==0){
			return null;
		} 

		if(max<max){
			max=5;
		}
		if(url==null){
			url = "javascript:void(0);";
		}
		StringBuffer html = new StringBuffer("<ul class=\"pagination justify-content-center\">");
		List<Integer> pages = page.getPages(max);
		if(pages.get(0)>1){
			html.append(formatLi(false, 1, url.replace("{page}", "1"), "首页"));
		}
		for(Integer i : pages){
			html.append(formatLi(i.equals(page.getCurrent()), i, url.replace("{page}", i.toString()), i.toString()));
		}
		if(pages.get(pages.size()-1)<page.getPageMax()){
			html.append(formatLi(false, page.getPageMax(), url.replace("{page}", page.getPageMax().toString()), "尾页"));
		}
		html.append("</ul>");
		return html.toString();
	}
	
	public String page(PageDTO<?> page,int max){
		return page(page, max, null);		
	}
	
	public String page(PageDTO<?> page,String url){
		return page(page, 5, url);
	}
	
	public String page(PageDTO<?> page){
		return page(page, 5, null);
	}
	
	
	public String concat(String... strs ){
		return String.join("", strs);
	}
	
	public List<String> toList(String str){
		try{
			return JSON.parseArray(str,String.class);
		}catch(Exception ex){
			return null;
		}
	}
	
	/**
	 * 截取前面部分字符串
	 * @param str - 要截取的字符串
	 * @param maxLen - 要截取的最大长度
	 * @param removeHtml - 是否要移除字符串里面的html标签
	 * @return
	 */
	public String subStr(String str, int maxLen,boolean removeHtml){
		if(removeHtml){
			str = str.replaceAll("<[^>]+>", "");
		}
		str = str.replaceAll("\\s", "");
		if(str.length()<=maxLen){
			return str;
		}else{
			return str.substring(0, maxLen-2)+"...";
		}
	}

	
	

}
